package final$finally$finalize区别.finally关键字;

public class FinallyDemo2 {

    public static void main(String[] args) {
        System.out.println(add());
    }

    /**
     * 程序运行的结果是：2
     * 这个结果应该有点意外，因为按照finally的语义，首先执行try代码块，
     * ++x后得到的结果应该是2， 接着再执行finally语句块，应该是在2的基础上再+1，得到结果是3，那为什么是2？
     * 当try中带有return时，会先执行return前的代码，然后暂时保存需要return的信息，再执行finally中的代码，
     * 最后再通过return返回之前保存的信息。所以这里运行的结果是2，而不是3。
     */
    public static int add() {
        int x = 1;
        try {
            return ++x;
        } catch (Exception e) {
            System.out.println("执行catch语句块");
            ++x;
        } finally {
            System.out.println("执行finally语句块");
            ++x;
        }
        return x;
    }

    /**
     * 当finally中有return的时候，try中的return会失效，在执行完finally的return之后，就不会再执行try中的return。
     * 不过不推荐在finally中写return，这会破坏程序的完整性；而且一旦finally里出现异常，会导致catch中的异常被覆盖。
     */
    public static int add2() {
        int x = 1;
        try {
            return ++x;
        } catch (Exception e) {
            System.out.println("执行catch语句块");
            ++x;
        } finally {
            System.out.println("执行finally语句块");
            ++x;
            return x;
        }
    }

}
